package jp.co.toshiba.ffsa.action.csas;

import java.util.ArrayList;
import java.util.LinkedHashMap;

import javax.annotation.Resource;

import jp.co.toshiba.ffsa.action.common.CommonAction;
import jp.co.toshiba.ffsa.common.ListBox;
import jp.co.toshiba.ffsa.form.csas.Csas101Form;
import jp.co.toshiba.ffsa.service.common.ConstantValue;
import jp.co.toshiba.ffsa.service.csas.Csas101Service;

import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ActionMessagesUtil;
import org.seasar.struts.util.MessageResourcesUtil;
import org.seasar.struts.util.RequestUtil;

/**
 * 新規ID登録>登録内容入力
 * @author npc
 */
public class Csas101Action extends CommonAction {

    /** 画面ID */
    public String screenID = "CSAS101";

    /** ActionForm */
    @ActionForm
    @Resource
    protected Csas101Form csas101Form;

    /** Regionリストボックス作成用 */
    public LinkedHashMap<String, String> regionList=new LinkedHashMap<String, String>();

    /**
     * 初期処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String index() throws Exception {
        try {
            // リファラ判定
            if(this.judgeRefferer()){
                // セッションタイムアウト判定
                if(this.judgeSession()){
                    // リストボックスの作成
                    ListBox listbox = new ListBox();
                    regionList = listbox.getRegionListBox();
                }else{
                    return this.topTransition;
                }
            }else{
                return this.topTransition;
            }
        } catch (Exception e) {
            this.errorLogWriter(e, "check", "CSAS101");
            throw e;
        }
        return "/csas/csas101.jsp";
    }

    /**
     * 確認処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = true,input="/csas/csas101")
    public String check() throws Exception {
        String transition = "";
        String result = "";
        try {
            // リファラ判定
            if(this.judgeRefferer()){
                // セッションタイムアウト判定
                if(this.judgeSession()){
                    // Serviceクラスを呼び出す
                    Csas101Service service = new Csas101Service();
                    service.setPassword(this.csas101Form.newPassword);
                    service.setEmailAddress(this.csas101Form.emailAddress);
                    service.setRegion(this.csas101Form.region);
                    boolean passwordCheck1 = service.passwordCheck1();
                    boolean passwordCheck2 = service.passwordCheck2();
                    boolean getUser        = service.getUser();
                    boolean blackList      = service.isValidMailDomain();
                    boolean isnotJapan     = service.isnotJapan();
                    // regionが日本以外の場合
                    if(isnotJapan){
                        // ブラックリストではない場合
                        if(blackList){
                            // パスワードにアルファベットと数字が両方含まれる場合
                            if(passwordCheck2){
                                // パスワードと同じ文字がメールアドレスに含まれない場合
                                if (passwordCheck1){
                                    // メールアドレスが存在しない場合またはUser_id_flag=0の場合
                                    if(getUser){
                                        transition = "/csas/csas103.jsp";
                                        result = ConstantValue.success;
                                    }else{
                                        // User_id_flag=1の場合
                                        ActionMessages messages = new ActionMessages();
                                        messages.add("userHaveExisted", new ActionMessage("errors.exist",MessageResourcesUtil.getMessage("mail_address"),true));
                                        ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);
                                        result = ConstantValue.fail;
                                        transition = "/csas/csas101";
                                    }
                                }else{
                                    // パスワードと同じ文字がメールアドレスに含まれる場合
                                    ActionMessages messages = new ActionMessages();
                                    messages.add("passwordCheckFailed", new ActionMessage("errors.password_duplicate_id", true));
                                    ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);
                                    result = ConstantValue.fail;
                                    transition = "/csas/csas101";
                                }
                            }else{
                                // パスワードが半角数字のみの場合または半角アルファベットのみの場合
                                ActionMessages messages = new ActionMessages();
                                messages.add("passwordCheckFailed", new ActionMessage("errors.password_both_letter", true));
                                ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);
                                result = ConstantValue.fail;
                                transition = "/csas/csas101";
                            }
                        }else{
                            // ブラックリストの場合
                            ActionMessages messages = new ActionMessages();
                            messages.add("blacklist", new ActionMessage("errors.invalid",MessageResourcesUtil.getMessage("mail_address"),true));
                            ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);
                            result = ConstantValue.fail;
                            transition = "/csas/csas101";
                        }
                    }else{
                        // regionが日本の場合
                        result = ConstantValue.fail;
                        this.genericErrorTitleMessageID    = "csas101.901";
                        this.genericErrorContentsMessageID = "csas101.902";
                        transition = "/common/error.jsp";
                    }
                    if(ConstantValue.success.equals(result)){
                        // 操作ログ記述
                        ArrayList<ArrayList<String>> parameters = new ArrayList<ArrayList<String>>();
                        ArrayList<String> parameterNames = new ArrayList<String>();
                        ArrayList<String> values = new ArrayList<String>();
                        parameterNames.add(MessageResourcesUtil.getMessage("mail_address"));
                        values.add("-");
                        parameterNames.add(MessageResourcesUtil.getMessage("new_password"));
                        values.add("-");
                        parameterNames.add(MessageResourcesUtil.getMessage("Reenter_new_password"));
                        values.add("-");
                        parameterNames.add(MessageResourcesUtil.getMessage("first_name"));
                        values.add(this.csas101Form.firstName);
                        parameterNames.add(MessageResourcesUtil.getMessage("last_name"));
                        values.add(this.csas101Form.lastName);
                        parameterNames.add(MessageResourcesUtil.getMessage("company"));
                        values.add(this.csas101Form.company);
                        parameterNames.add(MessageResourcesUtil.getMessage("department"));
                        values.add(this.csas101Form.department);
                        parameterNames.add(MessageResourcesUtil.getMessage("phone"));
                        values.add(this.csas101Form.phone);
                        parameterNames.add(MessageResourcesUtil.getMessage("region"));
                        values.add(this.csas101Form.region);
                        parameterNames.add(MessageResourcesUtil.getMessage("country"));
                        values.add(this.csas101Form.country);
                        parameterNames.add(MessageResourcesUtil.getMessage("city"));
                        values.add(this.csas101Form.city);
                        parameterNames.add(MessageResourcesUtil.getMessage("confirm_corporation"));
                        values.add(this.csas101Form.corporation);
                        parameters.add(parameterNames);
                        parameters.add(values);
                        this.entryOperationHistory(this.screenID, "submit", parameters, result);
                    }
                }else{
                    return this.topTransition;
                }
            }else{
                return this.topTransition;
            }
        }catch(Exception e) {
            this.errorLogWriter(e, "check", "CSAS101");
            throw e;
        }
        return transition;
    }
}